(function() { "use strict";
/**
 * 0.1.1
 * Deferred load js/css file, used for ui-jq.js and Lazy Loading.
 *
 * @ flatfull.com All Rights Reserved.
 * Author url: #user/flatfull
 */
window.app_uiload = angular.module("ui.load", [])
    .service("uiLoad", ["$document", "$q", "$timeout", function($document, $q, $timeout) {

        var loaded = [];
        var promise = false;
        var deferred = $q.defer();

        /**
         * Chain loads the given sources
         * @param srcs array, script or css
         * @returns {*} Promise that will be resolved once the sources has been loaded.
         */
        this.load = function(srcs) {
            srcs = angular.isArray(srcs) ? srcs : srcs.split(/\s+/);
            var self = this;

            if (!promise) {
                promise = deferred.promise;
            }

            angular.forEach(srcs, function(src) {
                promise = promise.then(function() {
                    return src.indexOf(".css") >= 0 ? self.loadCSS(src) : self.loadScript(src);
                });
            });
            deferred.resolve();

            return promise;
        };

        /**
         * Dynamically loads the given script
         * @param src The url of the script to load dynamically
         * @returns {*} Promise that will be resolved once the script has been loaded.
         */
        this.loadScript = function(src) {
            if (loaded[src]) {
                return loaded[src].promise;
            }

            var deferred = $q.defer();
            var script = $document[0].createElement("script");
            script.src = src;
            script.onload = function(e) {
                $timeout(function() {
                    deferred.resolve(e);
                });
            };
            script.onerror = function(e) {
                $timeout(function() {
                    deferred.reject(e);
                });
            };
            $document[0].body.appendChild(script);
            loaded[src] = deferred;

            return deferred.promise;
        };

        /**
         * Dynamically loads the given CSS file
         * @param href The url of the CSS to load dynamically
         * @returns {*} Promise that will be resolved once the CSS file has been loaded.
         */
        this.loadCSS = function(href) {
            if (loaded[href]) {
                return loaded[href].promise;
            }

            var deferred = $q.defer();
            var style = $document[0].createElement("link");
            style.rel = "stylesheet";
            style.type = "text/css";
            style.href = href;
            style.onload = function(e) {
                $timeout(function() {
                    deferred.resolve(e);
                });
            };
            style.onerror = function(e) {
                $timeout(function() {
                    deferred.reject(e);
                });
            };
            $document[0].head.appendChild(style);
            loaded[href] = deferred;

            return deferred.promise;
        };
    }]);

})();